package org.example.learn.javaagent.jvm_memory_and_gc_info;

import java.lang.instrument.Instrumentation;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Agent {

    // JVM 会首先尝试调用该方法
    public static void premain(String agentArgs, Instrumentation inst){
        System.out.println("JVM MEMORY AND GC INFO agentArgs: " + agentArgs);

        //newScheduledThreadPool(int corePoolSize)
        //创建一个线程池，可以安排命令在给定延迟后运行，或定期执行。
        //参数corePoolSize: 表示保留在线程中的线程，及时它处于空闲状态

        // scheduleAtFixedRate(Runnable command,int initialDelay,int period,TimeUnit unit)
        //创建并执行一个周期性动作，在给定的初始延迟后首先启用，然后在给定的时间段内启用； 即执行将在initialDelay之后开始，
        //然后是initialDelay+period ，然后是initialDelay + 2 * period ，依此类推。 如果任务的任何执行遇到异常，
        //则后续执行将被抑制。 否则，任务只会通过取消或终止执行程序而终止。 如果此任务的任何执行时间超过其周期，
        //则后续执行可能会延迟开始，但不会并发执行

        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                JVMStack.printMemoryInfo();
                JVMStack.printGCInfo();
                System.out.println("========================================");
            }
        },0,5000, TimeUnit.MILLISECONDS);
    }
}
